package com.cskaoyan.javase.oop1._10static._4usecase;

/**
 * > static关键字有什么具体的使用场景呢？
 *
 * 这里，我们显然需要根据static关键字的一些特点来明确它的使用场景
 *
 * 1. 静态成员变量：
 *    - 属于全体对象所共享而不是独属于某个对象的成员变量，所以
 *      - 当存在需要所有对象共享的变量时，应该使用static
 *    - **不仅是全体对象共享的，而且是整个类全局独一份的（因为类加载只有一次）**
 *      - 所以，如果希望某个变量在类的全局独一份，它应该是static修饰的变量
 *   需求:
 *        请计算一个类创建了多少次对象.需要一个计数器int count = 0;
 *        必须是静态成员变量.
 *
 * 2. 静态成员方法：
 *    - 静态方法的最主要特点就是调用简单，无需创建对象即可调用，所以
 *      - 如果希望一个方法能够更方便快捷的去调用，可以把它声明为static修饰的静态成员方法
 *    - 实际上根据静态成员方法调用简单的特点，当一个类中全部都是静态成员方法时
 *      - 它的方法调用都可以使用类名点去完成，这就是Java当中的**“工具类”**
 *      - 比如数组工具类Arrays、集合工具类Collections、数学工具类Math等等
 *    - 当然，静态成员方法也可以用来给静态成员变量赋值，这类似于用成员方法给成员变量赋值
 *      - 实际上成员方法也是可以给静态成员变量赋值的，但是这种赋值依赖于创建对象，是比较少用的方式
 *
 * 工具类: 所有的方法都是static修饰的,全部都使用类名点调用的类,专门供给外界调用,称之为"工具类"
 * 数组工具类: Arrays
 * 集合工具类: Collections
 * 对象工具类: Objects
 * 数学工具类: Math
 * 在后续的开发中,工具类的使用是非常广泛的,我们自己也需要经常写/用公司的工具类
 *
 * @since 16:08
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        for (int i = 0; i < 50; i++) {
            A a = new A();
        }
        System.out.println(A.count);
    }

    // 静态成员方法的最大特点,最大好处就是调用快,方便,不需要对象
    public static void test(){

    }
}

class A {
    static int count = 0;

    public A() {
        // 访问静态成员变量,即便是在同类中,还是更建议带上类名,以示区分,增加代码块可读性
        A.count++;
    }

    // 使用成员方法来给静态变量赋值,需要依赖于创建对象,但是一般不这么用
    public void test(){
        A.count = 100;
    }

    public static void test2(){
        A.count =1000;
    }
}
